#ifndef FLOW_WARP_LAYER_HPP_
#define FLOW_WARP_LAYER_HPP_

#include <vector>

#include "caffe/blob.hpp"
#include "caffe/layer.hpp"
#include "caffe/proto/caffe.pb.h"

namespace caffe {

	template <typename Dtype>
	class FlowWarpLayer : public Layer<Dtype> {
	public:
		explicit FlowWarpLayer(const LayerParameter& param)
				: Layer<Dtype>(param) {}
		virtual ~FlowWarpLayer() {};
		virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom,
								const vector<Blob<Dtype>*>& top);
		virtual void Reshape(const vector<Blob<Dtype>*>& bottom,
							 const vector<Blob<Dtype>*>& top);

	protected:
		virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom,
								 const vector<Blob<Dtype>*>& top);
		virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom,
								 const vector<Blob<Dtype>*>& top);
		virtual void Backward_cpu(const vector<Blob<Dtype>*>& top,
								  const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom);
		virtual void Backward_gpu(const vector<Blob<Dtype>*>& top,
								  const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom);

		Blob<Dtype> transposed_image_;
	};


}  // namespace caffe

#endif  // FLOW_WARP_LAYER_HPP_